﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Modelo.moduloEjemplar;
using SIGEB.Modelo;
using SIGEB.Prototipo.Control;

namespace SIGEB.Prototipo.Vista.moduloDocumentos
{
    public partial class frm_Ejemplares : frm_ModuloBase
    {
        #region "constructores"

        public frm_Ejemplares()
        {
            InitializeComponent();
            asignarUI(this.Controls);
        }

        public frm_Ejemplares(controlPrincipal cp)
            : base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
        }

        #endregion

        #region "metodos"

        private void dgv_usuarios_SelectionChanged(object sender, EventArgs e)
        {
            actualiarActual();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            eliminarEjemplar();
        }

        private void cbx_activo_CheckedChanged(object sender, EventArgs e)
        {
            if (eventoUsuario)
            {
                des_activarEjemplar();
            }
        }

        private void actualiarActual()
        {
            datoActual = getSelected();
            actualizarCampos();
            actualizarBotones();
        }

        private void actualizarCampos()
        {
            eventoUsuario = false;
            if (datoActual != null)
            {
                if (datoActual.estado == ejemplar.INACTIVO)
                {
                    cbx_activo.Checked = false;
                }
                else
                {
                    cbx_activo.Checked = true;
                }
            }
            eventoUsuario = true;
        }

        private void actualizarBotones()
        {
            btn_eliminar.Enabled = datoActual != null;
            cbx_activo.Enabled = datoActual != null;
        }

        private ejemplar getSelected()
        {
            try
            {
                dgv_ejemplar.Rows[dgv_ejemplar.SelectedCells[0].RowIndex].Selected = true;
                String code = dgv_ejemplar.SelectedRows[0].Cells[0].Value.ToString();
                return buscarEjemplar(code);
            }
            catch
            {
                return null;
            }
        }

        private ejemplar buscarEjemplar(string code)
        {
            foreach (ejemplar act in datosActuales)
            {
                if (act.numAdquisicion == code)
                {
                    return act;
                }
            }
            return null;
        }

        public override void actualizar(object referencia, bibliotecaObservador.EventoActualizacion e)
        {
            int conj = (int)referencia;
            if (conj == conjuntoBase.CONJEJEMPLARES)
            {
                cargarDatos();
                recargarDGV();
                if (datoActual != null)
                {
                    datoActual = buscarEjemplar(datoActual.numAdquisicion);
                }
                actualizarCampos();
                actualizarBotones();
            }
        }

        public override void hacerVisible(object[] arg)
        {
            if (arg != null && arg[0] != null)
            {   
                idDoc = (string)arg[0];
                txt_idDoc.Text = idDoc;
                limpiarCampos();
                cargarDatos();
                recargarDGV();
                actualizarBotones();
                actualizarCampos();
            }
        }

        private void cargarDatos()
        {
            try
            {
                datosActuales = cp.ctrlEjemplares.ejemplaresPorDocumento(idDoc);
            }
            catch(Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        private void recargarDGV()
        {
            if (String.IsNullOrEmpty(txt_busqueda.Text))
            {
                llenarDGV(datosActuales);
            }
            else
            {
                llenarDGV(buscarEjemplarTexto(txt_busqueda.Text));
            }
        }

        private LinkedList<ejemplar> buscarEjemplarTexto(string frase)
        {
            LinkedList<ejemplar> lista = new LinkedList<ejemplar>();
            if (datosActuales != null)
            {
                foreach (ejemplar act in datosActuales)
                {
                    if (frase==act.numAdquisicion)
                    {
                        lista.AddLast(act);
                    }
                }
            }
            return lista;
        }

        private void llenarDGV(LinkedList<ejemplar> datos)
        {
            llenarColumnas();
            if (datos != null)
            {
                foreach (ejemplar act in datos)
                {
                    dgv_ejemplar.Rows.Add(act.numAdquisicion, act.idDocumento, act.fechaIngreso, act.obtenerEstado());
                }
            }
        }

        private void llenarColumnas()
        {
            dgv_ejemplar.Columns.Clear();
            dgv_ejemplar.Columns.Add("NumAdquisicon", "Número de Adquisción");
            dgv_ejemplar.Columns.Add("CodDoc", "Código del Documento");
            dgv_ejemplar.Columns.Add("ingreso", "Fecha de Ingreso");
            dgv_ejemplar.Columns.Add("Estado", "Estado");
        }

        private void txt_busqueda_TextChanged(object sender, EventArgs e)
        {
            recargarDGV();
        }

        private void agregarEjemplar()
        {
            try
            {
                if (cp.ctrlEjemplares.valoresEjemplarValido(new ejemplar(txt_ejemplar.Text, txt_idDoc.Text, txt_ingreso.Value, ejemplar.DISPONIBLE)))
                {
                    cp.ctrlEjemplares.agregarEjemplar(new ejemplar(txt_ejemplar.Text, txt_idDoc.Text, txt_ingreso.Value, ejemplar.DISPONIBLE));
                    mostrarInfo("Ejemplar agregado");
                    limpiarCampos();
                }
            }
            catch(Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        private void limpiarCampos()
        {
            txt_ejemplar.Text = "";
            txt_idDoc.Text = idDoc;
            
            txt_ingreso.Value = DateTime.Today;
        }

        private void eliminarEjemplar()
        {
            if (datoActual != null)
            {
                if (confirmarOperacion("Si borra este ejemplar se borrarán los datos relacionados con este ejemplar, por ejemplo: préstamos\n"
                    + "anteriores"))
                {
                    try
                    {
                        cp.ctrlEjemplares.eliminar(datoActual.numAdquisicion);
                    }
                    catch (Exception ex)
                    {
                        ventanaError(ex.Message);
                    }
                }
            }
        }

        private void des_activarEjemplar()
        {
            if (datoActual != null)
            {
                if (cbx_activo.Checked)
                {
                    cp.ctrlEjemplares.activarEjemplar(datoActual.numAdquisicion);
                }
                else
                {
                    cp.ctrlEjemplares.desactivarEjemplar(datoActual.numAdquisicion);
                }
            }
        
        }

        private void btn_agregar_Click(object sender, EventArgs e)
        {
            agregarEjemplar();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            eliminarEjemplar();
        }

        #endregion

        #region "atributos"

        LinkedList<ejemplar> datosActuales;
        ejemplar datoActual;
        string idDoc;
        bool eventoUsuario = true;
        

        #endregion

        private void dgv_ejemplar_SelectionChanged(object sender, EventArgs e)
        {
            actualiarActual();
        }

        private void btn_imprimirCodigos_Click(object sender, EventArgs e)
        {
            LinkedList<ejemplar>[] obj = { datosActuales };
            string[] info = { idDoc };
            cp.abrirVentana(this, controlPrincipal.VENTANA_VISTA_PREVIA_CODIGOS, obj);
        }

    }
}
